package com.store.controller;

import com.store.common.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * 文件上传控制器
 * 
 * @author Store Team
 */
@Slf4j
@RestController
@RequestMapping("/upload")
public class FileUploadController {

    // 上传文件存储路径
    @Value("${file.upload.path:upload/images/}")
    private String uploadPath;

    // 允许的图片格式
    private static final String[] ALLOWED_EXTENSIONS = {".jpg", ".jpeg", ".png", ".gif", ".bmp", ".webp"};
    
    // 最大文件大小 5MB
    private static final long MAX_FILE_SIZE = 5 * 1024 * 1024;

    /**
     * 上传图片
     */
    @PostMapping("/image")
    public Result<Map<String, String>> uploadImage(@RequestParam("file") MultipartFile file) {
        try {
            // 验证文件
            if (file.isEmpty()) {
                return Result.error("请选择要上传的文件");
            }

            // 验证文件大小
            if (file.getSize() > MAX_FILE_SIZE) {
                return Result.error("文件大小不能超过5MB");
            }

            // 获取原始文件名
            String originalFilename = file.getOriginalFilename();
            if (originalFilename == null || originalFilename.isEmpty()) {
                return Result.error("文件名无效");
            }

            // 验证文件扩展名
            String extension = getFileExtension(originalFilename);
            if (!isAllowedExtension(extension)) {
                return Result.error("只支持上传图片文件（jpg、png、gif等）");
            }

            // 创建上传目录（按日期分类）
            String dateFolder = new SimpleDateFormat("yyyyMMdd").format(new Date());
            
            // 获取backend目录的绝对路径（确保始终保存到backend/upload）
            String projectPath = System.getProperty("user.dir");
            // 如果当前路径不在backend目录下，添加backend前缀
            if (!projectPath.endsWith("backend")) {
                projectPath = projectPath + File.separator + "backend";
            }
            String uploadDir = projectPath + File.separator + uploadPath + dateFolder + File.separator;
            
            File dir = new File(uploadDir);
            if (!dir.exists()) {
                dir.mkdirs();
            }

            // 生成唯一文件名
            String newFilename = UUID.randomUUID().toString().replace("-", "") + extension;
            String filePath = uploadDir + newFilename;

            // 保存文件
            Path path = Paths.get(filePath);
            Files.write(path, file.getBytes());

            // 返回文件访问URL
            String fileUrl = "/images/" + dateFolder + "/" + newFilename;
            
            Map<String, String> result = new HashMap<>();
            result.put("url", fileUrl);
            result.put("originalName", originalFilename);
            result.put("size", String.valueOf(file.getSize()));

            log.info("文件上传成功: {}", fileUrl);
            log.info("文件保存路径: {}", filePath);
            return Result.success("上传成功", result);

        } catch (IOException e) {
            log.error("文件上传失败", e);
            return Result.error("文件上传失败：" + e.getMessage());
        }
    }

    /**
     * 获取文件扩展名
     */
    private String getFileExtension(String filename) {
        int lastDotIndex = filename.lastIndexOf('.');
        if (lastDotIndex > 0) {
            return filename.substring(lastDotIndex).toLowerCase();
        }
        return "";
    }

    /**
     * 检查文件扩展名是否允许
     */
    private boolean isAllowedExtension(String extension) {
        for (String allowed : ALLOWED_EXTENSIONS) {
            if (allowed.equals(extension)) {
                return true;
            }
        }
        return false;
    }
}






